package 栈的模拟实现;

import java.util.Arrays;

public class MyStack {
    //栈中有效元素个数
    private int usedSize = 0;
    //创建一个数组elem模拟作为栈
    private int[] elem;
    //定义一个默认的长度常量
    private static final int DEFAULT_CAPACITY = 10;

    //构造一个长度为DEFAULT_CAPACITY的空栈
    public MyStack(){
        elem = new int[DEFAULT_CAPACITY];
    }

    //将x入栈
    void push(int x){
        //判断栈是否已经满了,如果满了就将栈进行扩容
        if (full()){
            //扩容操作
            elem = Arrays.copyOf(elem,elem.length*2);
        }
        //将elem[usedSize]的值改变为x,并且有效元素个数＋1
        elem[usedSize++] = x;
    }

    //将栈顶元素出栈并返回
    int pop(){
        //判断栈是否为空,如果为空就抛异常
        if (empty()){
            //抛异常操作(这是自定义异常)
            throw new EmptyException("栈中没有元素！");
        }
        //将elem[usedSize-1]的值弹出,并且有效元素个数-1
        return elem[--usedSize];
    }

    //获取栈顶元素
    int peek(){
        //判断栈是否为空,如果为空就抛异常
        if (empty()){
            //抛异常操作(这是自定义异常)
            throw new EmptyException("栈中没有元素！");
        }
        //获得elem[usedSize-1]的值,有效元素个数不变
        return elem[usedSize-1];
    }

    //获取栈中有效元素的个数
    int size(){
        return usedSize;
    }

    //检测栈是否为空
    boolean empty(){
        return usedSize == 0;
    }

    //检测栈是否为已经满了
    boolean full() {
        return usedSize == elem.length;
    }
}
